package com.mano.mall.common.utils;

import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

public class MyBeanUtils<Dto, Do> {

	/**
	 * dot 转换为Do 工具类
	 * 
	 * @param dtoEntity
	 * @param doClass
	 * @return
	 */
	public static <Do> Do dtoToDo(Object dtoEntity, Class<Do> doClass) {
		// 判断dto是否为空!
		if (dtoEntity == null) {
			return null;
		}
		// 判断DoClass 是否为空
		if (doClass == null) {
			return null;
		}
		try {
			Do newInstance = doClass.newInstance();
			BeanUtils.copyProperties(dtoEntity, newInstance);
			// Dto转换Do
			return newInstance;
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * do 转换为Dto 工具类
	 * 
	 * @param doEntity
	 * @param dtoClass
	 * @return
	 */
	public static <Dto> Dto doToDto(Object doEntity, Class<Dto> dtoClass) {
		// 判断dto是否为空!
		if (doEntity == null) {
			return null;
		}
		// 判断DoClass 是否为空
		if (dtoClass == null) {
			return null;
		}
		try {
			Dto newInstance = dtoClass.newInstance();
			BeanUtils.copyProperties(doEntity, newInstance);
			// Dto转换Do
			return newInstance;
		} catch (Exception e) {
			return null;
		}
	}

	public static <Dto> List<Dto> doListToDtoList(List<?> list,Class<Dto> dtoClass){
		if(CollectionUtils.isEmpty(list)){
			return null;
		}
		List<Dto> resultList = new ArrayList<>();
		for(int i = 0;i<list.size();i++){
			Class aClass = doToDto(list.get(i), dtoClass.getClass());
			resultList.add((Dto) aClass);
		}
		return resultList;
	}
	// 后面集合类型带封装

	/**
	 * 获取当前类的泛型类型
	 * @param cls
	 * @return
	 */
	public static Class getParameterizedType(Class cls){
		Type genericSuperclass = cls.getGenericSuperclass();
		if(null != genericSuperclass){
			ParameterizedType p= (ParameterizedType)genericSuperclass;
			//getActualTypeArguments获取参数化类型的数组，泛型可能有多个
			Class c=(Class) p.getActualTypeArguments()[0];
			return c;
		}
		return null;
	}
}
